Lesson 9

Python Basic, Lesson 4, v1.0.1, 2016.12 by David.Yi
Python Basic, Lesson 4, v1.0.2, 2017.03 modified by Yimeng.Zhang v1.2,2020.4 edit by David Yi

本次内容要点

  • 日期函数库 datetime 用法介绍,datetime、time 等库的介绍,获得日期,字符串和日期转换,日期格式介绍,日期加减计算
  • 思考

日期处理

datetime 是Python处理日期和时间的标准库,用于获取日期和进行日期计算等。

需要理解 timestamp,UTC标准时区,时差这些概念。

Python 的日期相关的标准库比较多(略有杂乱),有 datetime, time, calendar。

datetime 库包括 date 日期,time 时间, datetime 日期和时间,tzinfo 时区,timedelta 时间跨度计算 等主要对象。

获取当前日期和时间:now = datetime.now()

日期戳和日期的区别,日期戳更加精确,日期只是年月日 根据需要使用,大多数情况下只需要日期即可

Time 对于时间的处理更加精确,用时间戳的表达方式

时间戳定义为格林威治时间1970年01月01日00时00分00秒起至现在的总秒数,时间戳是惟一的


In [2]:
# 显示今天日期
# 显示今天 datetime 和 time

from datetime import datetime, date
import time

print(datetime.now())
print(date.today())
print(time.time())


2017-07-07 12:38:54.969064
2017-07-07
1499402334.9690642

In [3]:
# 各种日期时间类型的数据类型

print(type(datetime.now()))
print(type(date.today()))
print(type(time.time()))


<class 'datetime.datetime'>
<class 'datetime.date'>
<class 'float'>

In [3]:
# 连续运行显示时间戳,看看时间戳差了多少毫秒

for i in range(10):
    print(time.time())


1499402337.276191
1499402337.276191
1499402337.276191
1499402337.276191
1499402337.276191
1499402337.276191
1499402337.276191
1499402337.276191
1499402337.276191
1499402337.276191

In [4]:
# 用 time() 来计时,算10万次平方,看看哪台电脑速度快
import time
a = time.time()
for i in range(100000):
    j = i * i 

b = time.time()
    
print('time:', b-a)


time: 0.014995813369750977

日期库-字符串和日期的转换

字符串转化为日期:datetime.strptime()

日期转换为字符串:datetime.strftime()

日期字符串格式,举例

cday1 = datetime.now().strftime('%a, %b %d %H:%M')
cday2 = datetime.now().strftime('%A, %b %d %H:%M, %j')
cday3 = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

日期库 – 日期格式说明

  • %a 英文星期的简写 (shorthand of week in English)
  • %A 英文星期的完整拼写 (longhand of week in English)
  • %b 英文月份的简写 (shorthand of month in English)
  • %B 英文月份的完整拼写 (longhand of month in English)
  • %c 本地当前的日期与时间 (current local date and time)
  • %d 日期数, 1-31之间 (date, between 1-31))
  • %H 小时数, 00-23之间 (hour, between 00-23))
  • %I 小时数, 01-12之间 (hour, between 01-12)
  • %m 月份, 01-12之间 (month, between 01-12)
  • %M 分钟数, 01-59之间 (minute, 01-59)
  • %j 本年从第1天开始计数到当天的天数 (total days from 1st day of this year till now)
  • %w 星期数, 0-6之间(0是周日) (day of the week, between 0-6, 0=Sunday)
  • %W 当天属于本年的第几周,周一作为一周的第一天进行计算 (week of the year, starting with Monday )
  • %x 本地的当天日期 (local date)
  • %X 本地的当前时间 (local time)
  • %y 年份,0-99之间 (year, between 0-99)
  • %Y 年份的完整拼写 (longhand of year)

In [13]:
# 字符串转化为日期

dday = datetime.strptime('2017-1-2 18:19:59', '%Y-%m-%d %H:%M:%S')
print(dday)
print(type(dday))
print('\n')

# 日期转换为字符串

day1 = datetime.now().strftime('%Y, %W, %m %d %H:%M')
print(day1)
print(type(day1))


2017-01-02 18:19:59
<class 'datetime.datetime'>


2017, 19, 05 11 12:46
<class 'str'>

In [37]:
# 日期转换为字符串,各种格式

cday1 = datetime.now().strftime('%a, %b %d %H:%M')
cday2 = datetime.now().strftime('%A, %b %d %H:%M, %j')
cday3 = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(cday1)
print(cday2)
print(cday3)


Sun, Mar 19 11:28
Sunday, Mar 19 11:28, 078
2017-03-19 11:28:19

In [14]:
# 格式化时间戳为本地的时间 converts number of seconds to local time

print(time.localtime(time.time()))
print(time.localtime())  # If secs is not provided or None, the current time as returned by time() is used

print(type(time.localtime(time.time())))


time.struct_time(tm_year=2017, tm_mon=5, tm_mday=11, tm_hour=12, tm_min=47, tm_sec=34, tm_wday=3, tm_yday=131, tm_isdst=0)
time.struct_time(tm_year=2017, tm_mon=5, tm_mday=11, tm_hour=12, tm_min=47, tm_sec=34, tm_wday=3, tm_yday=131, tm_isdst=0)
<class 'time.struct_time'>

In [21]:
# 本地时间转换为字符串

t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
print(t)
print(type(t))


2017-03-19 11:02:10
<class 'str'>

日期计算

对日期和时间进行加减实际上就是把 datetime 往后或往前计算,得到新的 datetime,需要导入 datetime 的 timedelta 类。


In [15]:
# 日期计算
# timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

from datetime import timedelta

now = datetime.now()
now1 = now + timedelta(hours=-10)
print(now)
print(now1)


2017-05-11 12:48:38.858528
2017-05-11 02:48:38.858528

In [9]:
# 日期的各个变量的计算

now = datetime.now()
now1 = now + timedelta(hours=10, minutes=20, seconds=-10)
print(now)
print(now1)


2017-03-22 12:47:45.586054
2017-03-22 23:07:35.586054

思考

计算倒计时,现在距离2018元旦距离现在还有多少天


In [ ]:
from datetime import datetime

#日期格式转换
newyear = datetime.strptime('2018-01-01', '%Y-%m-%d')
#获取现在的时间
now = datetime.now()
#时间差
timedelta = newyear-now
print(timedelta.days)
print(type(newyear))